#!/usr/bin/env python
# -*- coding: utf-8 -*- 

'''
authors: Fábio Martins nº6041 and Miguel Travassos nº6312
'''

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import *
from sqlalchemy.orm import sessionmaker
from sqlalchemy import and_
from sqlalchemy import func
import csv

from classBD import*
from saveCsv import*


class statisticsClass(object):
	"""docstring for statisticsClass"""
	def __init__(self):
		#super(statisticsClass, self).__init__()
		self.engine = create_engine('sqlite:///LP.db')
		Session = sessionmaker(bind=self.engine)
		self.session = Session()
		
		self.destritos = ['Aveiro','Açores','Beja','Bragança','Coimbra','Évora','Guarda','Leiria','Madeira','Portalegre','Porto','Setúbal','Viana do Castelo','Viseu']
		self.dictDistritos = {'Braga':['Minho','Ave'],'Castelo Branco':['Castelo Branco','Beira Interior'],'Faro':['Algarve'],'Lisboa':['Lisboa','Estoril','Infante'],'Santarém':['Santarém','Tomar'],'Vila Real':['Trás-os-Montes']}

		#o número de alunos colocados por instituição
	def studentsNumberInstitution(self):
		"""funçao que faz a estatistica do número de alunos colocados por instituição"""
		csv = []
		csv.append(["Código da Instituição","Nome da Instituicão","Numero de colocados"])

		for x in self.session.query(colocacoesEnsinoSuperiorBD.codigoInstituicao,colocacoesEnsinoSuperiorBD.nomeInstituicao,func.sum(colocacoesEnsinoSuperiorBD.colocados)).\
        group_by(colocacoesEnsinoSuperiorBD.codigoInstituicao): 
			csv.append([x[0],x[1].encode('utf-8'),x[2]])

		return csv

		#o número de alunos colocados por Distrito
	def studentsNumberDistrict(self):
		"""funçao que faz a estatistica do número de alunos colocados por Distrito"""
		csv = []
		colsTitle = ["Distritos","Alunos Colocados"]
		self.coluna = colocacoesEnsinoSuperiorBD.colocados
		
		return self.perDistrict(self.coluna,colsTitle)

		#Permilagem de alunos colocados por distrito;
	def permilagemStudentsDistrict(self):
		"""funçao que faz a estatistica da Permilagem de alunos colocados por distrito"""
		csv = []
		csv.append(["Distritos","Permilagem"])
		for x in self.studentsNumberDistrict()[1:]:
			csv.append([x[0],float("{0:.2f}".format((x[1]*1000.0)/37415))])
		return csv


		#a percentagem de alunos colocados por instituição em relação a todos os alunos colocados
	def percentStudentsNumberInstitution(self):
		"""funçao que faz a estatistica da percentagem de alunos colocados por instituição em relação a todos os alunos colocados"""
		csv = []
		csv.append(["Código da Instituição","Nome da Instituicão","Percentagem de alunos colocados"])

		for x in self.studentsNumberInstitution()[1:]:
			csv.append([x[0],x[1],float("{0:.2f}".format(x[2]*100.0/37415))])

		return csv

		#o número de vagas por colocar por instituição
	def numberPlacesInstitution(self):
		"""funçao que faz a estatistica do número de vagas por colocar por instituição"""
		csv = []
		csv.append(["Código da Instituição","Nome da Instituicão","Vagas sobrantes"])
		for x in self.session.query(colocacoesEnsinoSuperiorBD.codigoInstituicao,colocacoesEnsinoSuperiorBD.nomeInstituicao,func.sum(colocacoesEnsinoSuperiorBD.vagasSobrantes)).\
        group_by(colocacoesEnsinoSuperiorBD.codigoInstituicao): 
			csv.append([x[0],x[1].encode('utf-8'),x[2]])

		return csv

		#o número de vagas por colocar por distrito.
	def numberPlacesDistrict(self):
		"""funçao que faz a estatistica do número de vagas por colocar por distrito"""
		
		self.coluna = colocacoesEnsinoSuperiorBD.vagasSobrantes
		colsTitle = ["Distritos","Vagas por Colocar"]

		return self.perDistrict(self.coluna,colsTitle)
		pass

	def perDistrict(self,coluna,colsTitle):
		"""Funçao que retorna a informaçao por distrito que ajuda nas outras estatisticas dos distritos"""
		
		self.colsTitle = colsTitle

		csv = []
		csv.append(self.colsTitle)
		soma = 0
		for i in range(len(self.destritos)):

			for x in self.session.query(colocacoesEnsinoSuperiorBD.nomeInstituicao,func.sum(self.coluna)).\
			filter(colocacoesEnsinoSuperiorBD.nomeInstituicao.like('%'+self.destritos[i].decode('utf-8')+'%')).all():
			
				csv.append([self.destritos[i],x[1]])

		for k in self.dictDistritos:
				for i in range(len(self.dictDistritos[k])):
					for x in self.session.query(colocacoesEnsinoSuperiorBD.nomeInstituicao,func.sum(self.coluna)).\
			filter(colocacoesEnsinoSuperiorBD.nomeInstituicao.like('%'+self.dictDistritos[k][i].decode('utf-8')+'%')).all():

						soma += x[1]
				csv.append([k,soma])
				soma = 0
		
		return csv

	def staticsGraphInstitution(self,institutionID):
		"""Funçao que retorna a informaçao do grafico selecionado na parte gráfica dos institutos"""

		institutionGraphInfo = []
		self.institutionID = institutionID

		for x in self.session.query(colocacoesEnsinoSuperiorBD.nomeInstituicao,func.sum(colocacoesEnsinoSuperiorBD.colocados),func.sum(colocacoesEnsinoSuperiorBD.vagasSobrantes)).\
			filter(colocacoesEnsinoSuperiorBD.codigoInstituicao == self.institutionID).all():
				institutionGraphInfo.append([x[0],x[1],float("{0:.2f}".format(x[1]*100.0/37415)),x[2]])

		return institutionGraphInfo

	def getInstitutionsName_and_ID(self):
		"""Retorna o id da instituiçao e o nome para ajudar na parte grafica"""

		return self.session.query(colocacoesEnsinoSuperiorBD.codigoInstituicao,colocacoesEnsinoSuperiorBD.nomeInstituicao).\
		group_by(colocacoesEnsinoSuperiorBD.codigoInstituicao).all()
			


